home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Libraries / stdwin / Appls / miniedit / miniedit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-03  |  6.7 KB  |  374 lines  |  [TEXT/????]

  1. /* Mini-editor using editwin module */
  2.  
  3. #include "stdwin.h"
  4. #include "tools.h"
  5. #include "editwin.h"
  6.  
  7. main(argc, argv)
  8.     int argc;
  9.     char **argv;
  10. {
  11.     winitargs(&argc, &argv);
  12.     menusetup();
  13.     openfiles(argc, argv);
  14.     mainloop();
  15.     wdone();
  16.     exit(0);
  17. }
  18.  
  19. MENU *filemenu, *editmenu, *findmenu;
  20.  
  21. #define FILE_MENU    1
  22. #define EDIT_MENU    2
  23. #define FIND_MENU    3
  24.  
  25. /* File items */
  26. #define NEW_ITEM    0
  27. #define OPEN_ITEM    1
  28. #define CLOSE_ITEM    3
  29. #define SAVE_ITEM    4
  30. #define SAVE_AS_ITEM    5
  31. #define SAVE_COPY_ITEM    6
  32. #define REVERT_ITEM    7
  33. #define QUIT_ITEM    9
  34.  
  35. /* Edit items */
  36. #define UNDO_ITEM    0
  37. #define CUT_ITEM    2
  38. #define COPY_ITEM    3
  39. #define PASTE_ITEM    4
  40. #define CLEAR_ITEM    5
  41. #define SEL_ALL_ITEM    6
  42. #define EXEC_ITEM    8
  43.  
  44. /* Find items */
  45. #define FIND_ITEM    0
  46. #define FIND_SAME_ITEM    1
  47. #define REPL_ITEM    3
  48. #define REPL_SAME_ITEM    4
  49. #define REPL_ALL_ITEM    5
  50.  
  51. menusetup()
  52. {
  53.     MENU *mp;
  54.     
  55.     filemenu= mp= wmenucreate(FILE_MENU, "File");
  56.     
  57.     wmenuadditem(mp, "New", 'N');
  58.     wmenuadditem(mp, "Open...", 'o');
  59.     wmenuadditem(mp, "", -1);
  60.     wmenuadditem(mp, "Close", 'K');
  61.     wmenuadditem(mp, "Save", 'S');
  62.     wmenuadditem(mp, "Save as...", -1);
  63.     wmenuadditem(mp, "Save a Copy...", -1);
  64.     wmenuadditem(mp, "Revert to Saved", -1);
  65.     wmenuadditem(mp, "", -1);
  66.     wmenuadditem(mp, "Quit", 'Q');
  67.     
  68.     editmenu= mp= wmenucreate(EDIT_MENU, "Edit");
  69.     
  70.     wmenuadditem(mp, "Undo", 'Z');
  71.     wmenuadditem(mp, "", -1);
  72.     wmenuadditem(mp, "Cut", 'X');
  73.     wmenuadditem(mp, "Copy", 'C');
  74.     wmenuadditem(mp, "Paste", 'V');
  75.     wmenuadditem(mp, "Clear", 'B');
  76.     wmenuadditem(mp, "Select All", 'A');
  77.     wmenuadditem(mp, "", -1);
  78.     wmenuadditem(mp, "Execute", '\r');
  79.     
  80.     findmenu= mp= wmenucreate(FIND_MENU, "Find");
  81.     
  82.     wmenuadditem(mp, "Find...", 'F');
  83.     wmenuadditem(mp, "Find Same", 'G');
  84.     wmenuadditem(mp, "", -1);
  85.     wmenuadditem(mp, "Replace...", 'R');
  86.     wmenuadditem(mp, "Replace Same", 'T');
  87.     wmenuadditem(mp, "Replace All", -1);
  88. }
  89.  
  90. fixmenus(ew)
  91.     EDITWIN *ew;
  92. {
  93.     bool focus;
  94.     
  95.     if (ew == NULL)
  96.         return;
  97.     
  98.     wmenuenable(filemenu, SAVE_ITEM, !ew->saved);
  99.     wmenuenable(filemenu, REVERT_ITEM, !ew->saved);
  100.     
  101.     wmenuenable(editmenu, UNDO_ITEM, FALSE);
  102.     wmenuenable(editmenu, EXEC_ITEM, FALSE);
  103.     
  104.     focus= tegetfoc1(ew->tp) < tegetfoc2(ew->tp);
  105.     wmenuenable(editmenu, CUT_ITEM, focus);
  106.     wmenuenable(editmenu, COPY_ITEM, focus);
  107.     wmenuenable(editmenu, CLEAR_ITEM, focus);
  108. }
  109.  
  110. openfiles(argc, argv)
  111.     int argc;
  112.     char **argv;
  113. {
  114.     int i;
  115.     
  116.     for (i= 1; i < argc; ++i) {
  117.         (void) ewcreate(argv[i]);
  118.     }
  119.     if (ewcount() == 0) {
  120.         if (ewopen() == NULL && ewnew() == NULL) {
  121.             wdone();
  122.             fprintf(stderr, "Can't open any windows\n");
  123.             exit(1);
  124.         }
  125.     }
  126. }
  127.  
  128. mainloop()
  129. {
  130.     for (;;) {
  131.         EVENT e;
  132.         EDITWIN *ew;
  133.         
  134.         wgetevent(&e);
  135.         ew= ewfind(e.window);
  136.         switch (e.type) {
  137.         case WE_MENU:
  138.             switch (e.u.m.id) {
  139.             
  140.             case FILE_MENU:
  141.                 switch (e.u.m.item) {
  142.                 case NEW_ITEM:
  143.                     (void) ewnew();
  144.                     break;
  145.                 case OPEN_ITEM:
  146.                     (void) ewopen();
  147.                     break;
  148.                 case CLOSE_ITEM:
  149.                     if (ew != NULL) {
  150.                         ewclose(ew);
  151.                         if (ewcount() == 0)
  152.                             return;
  153.                     }
  154.                     break;
  155.                 case SAVE_ITEM:
  156.                     if (ew != NULL)
  157.                         ewsave(ew);
  158.                     break;
  159.                 case SAVE_AS_ITEM:
  160.                     if (ew != NULL)
  161.                         ewsaveas(ew);
  162.                     break;
  163.                 case SAVE_COPY_ITEM:
  164.                     if (ew != NULL)
  165.                         ewsavecopy(ew);
  166.                     break;
  167.                 case REVERT_ITEM:
  168.                     if (ew != NULL)
  169.                         ewrevert(ew);
  170.                     break;
  171.                 case QUIT_ITEM:
  172.                     if (ewcloseall())
  173.                         return;
  174.                     break;
  175.                 }
  176.                 break;
  177.             
  178.             case EDIT_MENU:
  179.                 if (ew == NULL) {
  180.                     wfleep();
  181.                     break;
  182.                 }
  183.                 switch (e.u.m.item) {
  184.                 case UNDO_ITEM:
  185.                     ewundo(ew);
  186.                     break;
  187.                 case CUT_ITEM:
  188.                     ewcopy(ew);
  189.                     ewreplace(ew, "");
  190.                     break;
  191.                 case COPY_ITEM:
  192.                     ewcopy(ew);
  193.                     break;
  194.                 case PASTE_ITEM:
  195.                     ewpaste(ew);
  196.                     break;
  197.                 case CLEAR_ITEM:
  198.                     ewreplace(ew, "");
  199.                     break;
  200.                 case SEL_ALL_ITEM:
  201.                     tesetfocus(ew->tp, 0,
  202.                         tegetlen(ew->tp));
  203.                     break;
  204.                 case EXEC_ITEM:
  205.                     wfleep();
  206.                     break;
  207.                 }
  208.                 break;
  209.             
  210.             case FIND_MENU:
  211.                 switch (e.u.m.item) {
  212.                 case FIND_ITEM:
  213.                     find(ew, TRUE);
  214.                     break;
  215.                 case FIND_SAME_ITEM:
  216.                     find(ew, FALSE);
  217.                     break;
  218.                 case REPL_ITEM:
  219.                     replace(ew, TRUE);
  220.                     break;
  221.                 case REPL_SAME_ITEM:
  222.                     replace(ew, FALSE);
  223.                     break;
  224.                 case REPL_ALL_ITEM:
  225.                     replall(ew);
  226.                     break;
  227.                 }
  228.                 break;
  229.             
  230.             }
  231.             break;
  232.         
  233.         default:
  234.             if (ew != NULL) {
  235.                 bool closed;
  236.                 wsetwincursor(ew->win, wfetchcursor("watch"));
  237.                 ewevent(ew, &e, &closed);
  238.                 if (!closed)
  239.                     wsetwincursor(ew->win,
  240.                            wfetchcursor("ibeam"));
  241.                 if (closed && ewcount() == 0)
  242.                     return;
  243.             }
  244.             break;
  245.         
  246.         }
  247.         
  248.         fixmenus(ew);
  249.     }
  250. }
  251.  
  252. #include "regexp.h"
  253.  
  254. char whatbuf[256];    /* Last regular expression typed */
  255. regexp *prog;        /* Compiled regular expression */
  256. char replbuf[256];    /* Last replacement string */
  257.  
  258. bool
  259. find(ew, dodialog)
  260.     EDITWIN *ew;
  261.     bool dodialog;
  262. {
  263.     return finddialog(ew, dodialog, "Find regular expression:") &&
  264.         findit(ew, FALSE);
  265. }
  266.  
  267. bool
  268. replace(ew, dodialog)
  269.     EDITWIN *ew;
  270.     bool dodialog;
  271. {
  272.     if (!finddialog(ew, dodialog, "Replace regular expression:")
  273.         || !findit(ew, TRUE))
  274.         return FALSE;
  275.     wupdate(ew->win); /* Show what we've found */
  276.     return repldialog(ew, dodialog) && replit(ew);
  277. }
  278.  
  279. replall(ew)
  280.     EDITWIN *ew;
  281. {
  282.     if (!replace(ew, TRUE))
  283.         return FALSE;
  284.     while (findit(ew, TRUE)) {
  285.         wupdate(ew->win);
  286.         replit(ew);
  287.         wupdate(ew->win);
  288.         /* What if it takes forever? */
  289.     }
  290.     return TRUE;
  291. }
  292.  
  293. bool
  294. finddialog(ew, dodialog, prompt)
  295.     EDITWIN *ew;
  296.     bool dodialog;
  297.     char *prompt;
  298. {
  299.     if (ew == NULL)
  300.         return FALSE;
  301.     if (dodialog || prog == NULL) {
  302.         if (!waskstr(prompt, whatbuf, sizeof whatbuf))
  303.             return FALSE;
  304.         if (prog != NULL)
  305.             free((char*)prog);
  306.         prog= regcomp(whatbuf);
  307.         if (prog == NULL)
  308.             return FALSE;
  309.     }
  310.     return TRUE;
  311. }
  312.  
  313. bool
  314. repldialog(ew, dodialog)
  315.     EDITWIN *ew;
  316.     bool dodialog;
  317. {
  318.     if (!dodialog)
  319.         return TRUE;
  320.     return waskstr("Replacement string:", replbuf, sizeof replbuf);
  321. }
  322.  
  323. bool
  324. findit(ew, begin)
  325.     EDITWIN *ew;
  326.     bool begin; /* TRUE if must start at foc1 */
  327. {
  328.     int foc1= tegetfoc1(ew->tp);
  329.     int foc2= tegetfoc2(ew->tp);
  330.     int len= tegetlen(ew->tp);
  331.     char *text= tegettext(ew->tp);
  332.     
  333.     if (!reglexec(prog, text, begin ? foc1 : foc2)) {
  334.         wfleep();
  335.         return FALSE;
  336.     }
  337.     if (!begin && prog->startp[0] == text+foc2 && foc1 == foc2 &&
  338.         prog->startp[0] == prog->endp[0]) {
  339.         /* Found empty string at empty focus;
  340.            try again at next position (if in range) */
  341.         if (++foc2 > len)
  342.             return FALSE;
  343.         if (!reglexec(prog, text, foc2)) {
  344.             wfleep();
  345.             return FALSE;
  346.         }
  347.     }
  348.     tesetfocus(ew->tp, (int)(prog->startp[0] - text),
  349.         (int)(prog->endp[0] - text));
  350.     return TRUE;
  351. }
  352.  
  353. bool
  354. replit(ew)
  355.     EDITWIN *ew;
  356. {
  357.     char substbuf[1024];
  358.     /* Should be bigger -- what if the entire file matches? */
  359.     
  360.     regsub(prog, replbuf, substbuf);
  361.     ewreplace(ew, substbuf);
  362.     return TRUE;
  363. }
  364.  
  365. void
  366. regerror(str)
  367.     char *str;
  368. {
  369.     char buf[256];
  370.     
  371.     sprintf(buf, "Regular expression error: %s", str);
  372.     wmessage(buf);
  373. }
  374.